/**
 * 
 */
package jmine.tec.test.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;

import jmine.tec.proxy.EmptyInvocationHandler;

/**
 * {@link InvocationHandler} para ser usado como um objeto mock sobre uma interface.
 * <p>
 * O objeto contem um mapa de {@link String} para {@link Object}, que corresponde a mapeamentos entre o nome de um metodo e o valor que será
 * devolvido, se o tipo de retorno for compativel com o tipo do objeto. Se um metodo nao for especificado, ou o tipo nao for compativel,
 * este invocation handler devolve o valor default para o tipo de retorno do metodo.
 * 
 * @author takeshi
 * @deprecated usar {@link MockObjectChainElement}
 */
@Deprecated
public class MockObjectInvocationHandler extends EmptyInvocationHandler implements InvocationHandler {

    private Map<String, Object> objetos = new HashMap<String, Object>();

    /**
     * Invoke
     * 
     * @param proxy Object
     * @param method Method
     * @param args argumentos
     * @return Object
     * @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object, java.lang.reflect.Method, java.lang.Object[])
     */
    @Override
    public Object invoke(final Object proxy, final Method method, final Object[] args) {
        if (this.objetos.containsKey(method.getName())) {
            Object val = this.objetos.get(method.getName());
            if (MockObjectSupport.checkCompatible(method.getReturnType(), val)) {
                return val;
            }
        }
        return MockObjectSupport.getDefaultValueFor(method.getReturnType());
    }

    /**
     * @return the objetos
     */
    public final Map<String, Object> getObjetos() {
        return this.objetos;
    }

    /**
     * @param objetos the objetos to set
     */
    public final void setObjetos(final Map<String, Object> objetos) {
        this.objetos = objetos;
    }

}
